package com.ming_za.od_updater_sdk.handler;

import com.ming_za.od_updater_sdk.ODUpdater;
import com.ming_za.od_updater_sdk.event.*;
import com.ming_za.od_updater_sdk.transmit.BasisStreamTransmit;
import com.ming_za.od_updater_sdk.transmit.IStreamTransmit;

public interface IUpdateHandler {

    /**
     * 更新启动前调用，每次开启更新仅调用一次
     * @param event 存储需要更新的所有资源数据，以及版本,通过调用{@link UpdateStartEvent#setCancel(boolean)}拦截更新启动
     * @param odUpdater 更新器对象，便于获取更新器配置信息
     */
    void updateStart(UpdateStartEvent event, ODUpdater odUpdater);

    /**
     * 每个版本更新开始时调用
     * @param version 当前更新的版本
     */
    void updateStartVersion(int version);

    /**
     * 资源预更新
     * <p>每个资源更新前调用</p>
     * <p>可在此方法内拦截当前资源并忽略其更新</p>
     * @param event 存储当前资源相关的信息，通过调用{@link PreUpdateEvent#setCancel(boolean)}进行更新拦截
     */
    void preUpdate(PreUpdateEvent event);

    /**
     * 资源更新时
     * <p>该函数在当前"非删除类型"资源发送请求后(或"删除类型"资源获取文件信息后)，文件数据传输前(或文件删除前)调用</p>
     * <p>该事件无法进行取消操作</p>
     * @param event 存储文件大小，文件的传输流
     *              <p>不建议在此处直接操作数据流！</p>
     *              <p>如果您需要对传输流进行操作，请继承{@link BasisStreamTransmit}或者实现{@link IStreamTransmit}接口并在更新器启动前传入</p>
     */
    void update(UpdatingEvent event);

    /**
     * 资源更新后
     */
    void postUpdate(PostUpdateEvent event);

    /**
     * 更新出错调用
     * @param event 存储更新错误和资源信息
     */
    void updateError(UpdateErrorEvent event);

    /**
     * 每个版本更新完成且没有错误的情况下调用
     * @param version 当前更新完成的版本号
     */
    void updateDoneVersion(int version);

    /**
     * 所有内容更新完成时调用,更新完成后仅调用一次
     */
    void allUpdateComplete(UpdateCompleteEvent event);

}
